﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CuaHangMayTinh.BusinessEntities;
using CuaHangMayTinh.DataProvider;
using CuaHangMayTinh.Utilities;
using System.Data;

namespace CuaHangMayTinh.DataAccessLayer
{
    /// <summary>
    /// Lớp KhachHangDA: Lấy thông tin khách hàng từ cơ sở dữ liệu
    /// </summary>
    public class KhachHangDA
    {
        public KhachHangDA()
        {

        }

        /// <summary>
        /// Hàm thêm 1 khách hàng mới
        /// </summary>
        /// <param name="entity">Là 1 KhachHangEntity cần được thêm mới vào CSDL </param>
        /// <returns>0: Không thêm được</returns>
        /// <returns> #0: Thêm được</returns>
        public int Insert(KhachHangEntity entity)
        {
            try
            {
                ParameterBuilder pb = DBFactory.CreateParamBuilder();

                pb.AddParameter("TenKH", entity.TenKH);
                pb.AddParameter("CMND_MaSoThue", entity.CMND_MaSoThue);
                pb.AddParameter("DiaChi", entity.DiaChi);
                pb.AddParameter("SoDT", entity.SoDT);
                pb.AddParameter("Email", entity.Email);
                return (int)DBFactory.Database.ExecuteNonQuery("KhachHang_Insert", pb.Parameters);
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                throw new Exception(ex.Message, ex);
            }
        }

        /// <summary>
        /// Hàm thêm 1 khách hàng mới
        /// </summary>
        /// <param name="entity">Là 1 KhachHangEntity cần được thêm mới vào CSDL </param>
        /// <returns>0: Không thêm được</returns>
        /// <returns> #0: Trả về ID khách hàng mới thêm vào</returns>
        public int InsertGetID(KhachHangEntity entity)
        {
            try
            {
                ParameterBuilder pb = DBFactory.CreateParamBuilder();

                pb.AddParameter("TenKH", entity.TenKH);
                pb.AddParameter("CMND_MaSoThue", entity.CMND_MaSoThue);
                pb.AddParameter("DiaChi", entity.DiaChi);
                pb.AddParameter("SoDT", entity.SoDT);
                pb.AddParameter("Email", entity.Email);
                return (int)DBFactory.Database.ExecuteNonQueryGetID("KhachHang_Insert", pb.Parameters);
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                throw new Exception(ex.Message, ex);
            }
        }

        /// <summary>
        /// Hàm cập nhật 1 khách hàng
        /// </summary>
        /// <param name="entity">Là 1 KhachHangEntity cần được cập nhật </param>
        /// <returns>false: Không cập nhật được</returns>
        /// <returns>true: cập nhật được</returns>
        public bool UpDate(KhachHangEntity entity)
        {
            try
            {
                ParameterBuilder pb = DBFactory.CreateParamBuilder();
                pb.AddParameter("MaKH", entity.MaKH);
                pb.AddParameter("TenKH", entity.TenKH);
                pb.AddParameter("CMND_MaSoThue", entity.CMND_MaSoThue);
                pb.AddParameter("DiaChi", entity.DiaChi);
                pb.AddParameter("SoDT", entity.SoDT);
                pb.AddParameter("Email", entity.Email);

                int numRowEffected = DBFactory.Database.ExecuteNonQuery("KhachHang_UpDate", pb.Parameters);
                return (numRowEffected > 0);
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                throw new Exception(ex.Message, ex);
            }
        }

        /// <summary>
        /// Hàm tìm tất cả thông tin về khách hàng
        /// </summary>
        /// <returns>DataTable chứa thông tin của tất cả khách hàng</returns>
        public DataTable Find_All()
        {
            try
            {
                return DBFactory.Database.FillDataTable("SELECT * FROM KhachHang");
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                throw new Exception(ex.Message, ex);
            }
        }

        /// <summary>
        /// Hàm tìm tất cả thông tin về khách hàng theo tên của khách hàng
        /// </summary>
        /// <param name="ten">tên cua khách hàng muốn tìm</param>
        /// <returns>DataTable</returns>
        public DataTable Find_Ten(string ten)
        {
            try
            {
                DataTable dt = new DataTable();
                ParameterBuilder pd = DBFactory.CreateParamBuilder();
                pd.AddParameter("TenKH", ten);

                dt = DBFactory.Database.FillDataTable("KhachHang_Find_Ten", pd.Parameters);
                return dt;
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                throw new Exception(ex.Message, ex);
            }
        }

        /// <summary>
        /// Hàm tìm tất cả thông tin về khách hàng theo ID của khách hàng
        /// </summary>
        /// <param name="id">ID cua khách hàng muốn tìm</param>
        /// <returns>DataTable</returns>
        public DataTable Find_ID(int id)
        {
            try
            {
                DataTable dt = new DataTable();
                ParameterBuilder pd = DBFactory.CreateParamBuilder();
                pd.AddParameter("MaKH", id);

                dt = DBFactory.Database.FillDataTable("KhachHang_Find_MaKH", pd.Parameters);
                return dt;
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                throw new Exception(ex.Message, ex);
            }
        }

        /// <summary>
        /// Hàm tìm tất cả thông tin về khách hàng theo CMND của khách hàng
        /// </summary>
        /// <param name="CMND">CMND cua khách hàng muốn tìm</param>
        /// <returns>DataTable</returns>
        public DataTable Find_CMND(string CMND)
        {
            try
            {
                DataTable dt = new DataTable();
                ParameterBuilder pd = DBFactory.CreateParamBuilder();
                pd.AddParameter("CMND_MaSoThue", CMND);

                dt = DBFactory.Database.FillDataTable("KhachHang_Find_CMND", pd.Parameters);
                return dt;
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                throw new Exception(ex.Message, ex);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="MaHDBan"></param>
        /// <returns></returns>
        public DataTable Find_MaHDBan(int MaHDBan)
        {
            try
            {
                DataTable dt = new DataTable();
                ParameterBuilder pd = DBFactory.CreateParamBuilder();
                pd.AddParameter("MaHDBan", MaHDBan);

                dt = DBFactory.Database.FillDataTable("KhachHang_Find_MaHDBan", pd.Parameters);
                return dt;
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                throw new Exception(ex.Message, ex);
            }
        }

        /// <summary>
        /// Hàm xóa 1 khách hàng
        /// </summary>
        /// <param name="id">id của khách hàng muốn xóa</param>
        /// <returns></returns>
        public bool Delete(int id)// chưa viết SP
        {
            try
            {
                ParameterBuilder pd = DBFactory.CreateParamBuilder();
                pd.AddParameter("MaKH", id);

                return DBFactory.Database.ExecuteNonQuery("KhachHang_Delete", pd.Parameters) > 0;
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                throw new Exception(ex.Message, ex);
            }
        }

        /// <summary>
        /// hàm chuyển datatable thành 1 list KhachHangEntity
        /// </summary>
        /// <param name="dt">1 datatable chứa KhachHangEntity</param>
        /// <returns>Trả về 1 list KhachHangEntity</returns>
        public List<KhachHangEntity> ConvertToList(DataTable dt)
        {
            List<KhachHangEntity> list = new List<KhachHangEntity>();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                int id = (int)dt.Rows[i][0];
                string ten = dt.Rows[i][1].ToString();
                string cmnd = dt.Rows[i][2].ToString();
                string diachi = dt.Rows[i][3].ToString();
                string phone = dt.Rows[i][4].ToString();
                string email = dt.Rows[i][5].ToString();

                KhachHangEntity entity = new KhachHangEntity(id, ten, cmnd, diachi, phone, email);
                list.Add(entity);
            }
            return list;
        }
    }
}
